package reflect;

import org.junit.Test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 反射
 */
public class ReflectTest {
    @Test
    public void test() throws Exception {
       /* 注意：1.运行时类必须提供空参的构造器
               2.空参的构造器的访问权限要够，设置为public
          再javabean中要求提供一个public的空参构造器。原因：
          1.便于通过反射，创建运行时类的对象
          2.便与子类继承此类运行时类时，默认调用super（）时，保证父类有此构造器
        */
        Class<Person> personClass = Person.class;
        //使用方法创建运行时类的对象（无参）
        Person person = personClass.newInstance();
        /**
         * 调用属性
         */
        //1.获取运行时类中指定的变量名
        Field name = personClass.getDeclaredField("name");
        //2.保证当前属性时可访问的
        name.setAccessible(true);
        //3.设置、获取指定对象的此属性方法
        name.set(person,"tom");
        System.out.println(name.get(person));
        /**
         * 调用方法
         */
        Method declaredMethod = personClass.getDeclaredMethod("meth01");
        declaredMethod.setAccessible(true);
        //调用invoke方法
        declaredMethod.invoke(person);

    }
}
